import axios from 'axios'

import {BASE_URL, TIMEOUT} from './config'

// 创建axios实例
export function request(config){
  const instance = axios.create({
    baseURL: BASE_URL,
    timeout: TIMEOUT,
  })
  
  // 请求拦截
  
  instance.interceptors.request.use(config => {
    // 在发送请求之前做些什么
    // 1、在请求头中添加token
    // config.headers.Authorization = `Bearer ${token}`
  
    // 2、也可以返回一个 Promise，Promise 被 reject 后会中断请求
    // return new Promise((resolve, reject) => {
    //   setTimeout(() => {
    //     reject(new Error('timeout'))
    //   }, 5000)
    // })
  
    // 3、或者直接 reject 出去
    // throw new Error('Request timeout')
  
    // 4、或者返回一个新的 Promise
    // return new Promise((resolve, reject) => {
    //   setTimeout(() => {
    //     resolve(config)
    //   }, 5000)
    // })
  
    // 5、或者返回一个新的 config
    // config.data.token = 'new token'
  
    // 6、或者返回一个新的 Promise，Promise 被 resolve 后会中断请求
    // 7、拦截config中的一些信息，不符合服务器的要求，如headers
    // 8、每次发送网络请求时，希望界面中显示请求的图标，请求成功后隐藏
    // 9、某些网络请求必须携带一些特殊的信息，如登录的token
    return config
  }, error => {
    // 请求错误处理
    Promise.reject(error)
  })
  
  // 响应拦截
  
  instance.interceptors.response.use(response => {
    // 对响应数据做些什么
    // 1、对返回的数据做 JSON 解析
    // return response.data? JSON.parse(response.data) :
    return response.data
  }, error => {
    // 响应错误处理
    if (error.response) {
      // 状态码在2xx之外的情况
      console.log(error.response.status)
      console.log(error.response.data)
      console.log(error.response.headers)
    } else if (error.request) {
      // 请求时发生错误
      console.log('Error', error.request)
    } else {
      // 其他错误
      console.log('Error', error.message)
    }
    return Promise.reject(error.response || error.message)
  })

  return instance(config)
}
